package com.leyou.item.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.leyou.common.pojo.PageResult;
import com.leyou.item.mapper.BrandMapper;
import com.leyou.item.pojo.Brand;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.util.StringUtil;

import java.util.List;

@Service
@Transactional
public class BrandService {

    @Autowired
    private BrandMapper brandMapper;

    /**
     * 根据查询条件分页并排序查询品牌信息，返回数据。
     *
     * @param key：搜素的关键字，不必填
     * @param page：当前页，默认是1，第一页
     * @param rows：每页多少条数据，默认是5
     * @param sortBy：排序的字段，也就是根据哪个字段进行排序，不必填
     * @param desc：是否倒叙排序，不必填
     * @return 封装好分页数据，PageResult里包含总条数，总页数，和当前页的数据<Brand>泛型
     */
    public PageResult<Brand> queryBrandByPage(String key, Integer page, Integer rows, String sortBy, Boolean desc) {

// ==================================通用mapper拼接SQL完成查询，并且封装到分页PageInfo里
        // 初始化example对象
        Example example = new Example(Brand.class);
        Example.Criteria criteria = example.createCriteria();

        // 根据name模糊查询，或者根据首字母查询
        // 如果key不为空的话，
        if (StringUtils.isNotBlank(key)) {
            // 查出来的数据封装到Brand对象里，等效于 select * from tb_brand where name like '%key%' or letter = key
            criteria.andLike("name", "%" + key + "%").orEqualTo("letter", key);
        }

        // 添加分页条件,当前页是1，每页5条数据
        PageHelper.startPage(page, rows);

        // 添加排序的条件,如果排序的字段有值的话
        if (StringUtils.isNotBlank(sortBy)) {
            // 等效于，在上面的sql后再加上 order by (id或者letter) desc  (后面三元判断值是否为空)
            example.setOrderByClause(sortBy + " " + (desc ? "desc" : "asc"));
        }
        // 使用通用mapper接口调用封装的example
        List<Brand> brands = this.brandMapper.selectByExample(example);

        // 使用pageInfo包装结果集，这个对象里有总记录数，总页数，结果集等等数据，之前写的直接把pageInfo返回，然后前台根据这个对象渲染数据，这里把数据封装到分页工具类返回
        PageInfo<Brand> brandPageInfo = new PageInfo<>(brands);

        // 把数据给PageResult对象，并且返还，总条数和结果集
        return new PageResult<>(brandPageInfo.getTotal(), brandPageInfo.getList());

    }

    /**
     * 新增品牌
     *
     * @param brand：品牌对象
     * @param cids：所属品牌编号
     */
    public void saveBrand(Brand brand, List<Long> cids) {

        //// 所有过来的ID先去查下，如果有代表修改，如果没有代表新增
        //Brand brandByOne = this.brandMapper.selectByPrimaryKey(brand.getId());
        //if (brandByOne != null) {
        //    // 先把关系表删掉
        //    this.brandMapper.deleteBrandAndCategory(brand.getId());
        //    // 证明有数据,update操作修改品牌表
        //    this.brandMapper.updateBrand(brand.getId(), brand.getName(), brand.getImage(), brand.getLetter());
        //    // 再插入
        //    cids.forEach(cid -> {
        //        this.brandMapper.insertBrandAndCategory(cid, brand.getId());
        //    });
        //
        //} else {
        // 为空查不到,直接新增
        //this.brandMapper.insertSelective(brand);
        //// 中间表新增数据,根据所属一个品牌循环。插入cid(所属品牌)多个和1个商品id对应。
        //// 通用mapper里一个方法里只能写一个insert，所以这个insertBrandAndCategory需要单独写方法。
        //cids.forEach(cid -> {
        //            this.brandMapper.insertBrandAndCategory(cid, brand.getId());
        //        }
        //);
        // 直接新增

        this.brandMapper.insertSelective(brand);
        // 中间表新增数据,根据所属一个品牌循环。插入cid(所属品牌)多个和1个商品id对应。
        // 通用mapper里一个方法里只能写一个insert，所以这个insertBrandAndCategory需要单独写方法。
        cids.forEach(cid -> {
            this.brandMapper.insertBrandAndCategory(cid, brand.getId());
        });
    }


    /**
     * 修改品牌
     *
     * @param brand
     */
    public void editBrand(Brand brand) {
        this.brandMapper.updateByPrimaryKeySelective(brand);
    }

    /**
     * 删除品牌
     *
     * @param bid
     * @return
     */
    public void deleteByBrandId(Long bid) {
        // 先删掉关系表里的关系
        this.brandMapper.deleteBrandAndCategory(bid);
        // 再删掉品牌表里的数据
        this.brandMapper.deleteByPrimaryKey(bid);
    }

    /**
     * 新增商品里，根据spu表里的brand_id去查询品牌
     *
     * @param cid
     * @return
     */
    public List<Brand> queryBrandByCid(Long cid) {
        return this.brandMapper.queryBrandByCid(cid);
    }

    /**
     * 根据id查询品牌表里的品牌获取品牌对象
     * @param id
     * @return
     */
    public Brand queryBrandByCidForEs(Long id) {
        return this.brandMapper.selectByPrimaryKey(id);
    }
}
